import { getKeyRouter } from '@/utils';
import { isFalsy } from '../../Acommon';

class CreateTarget {
  private _map: Map<any, any>;
  private _targets: Record<string, any>[];
  constructor() {
    this._map = new Map();
    this._targets = [];
  }

  /**
   * @param targets 集合
   * @param key 键 [默认为"materialID"，用于判断合并的依据，具有唯一性]
   * @param flag 开关，用于控制特定的合并逻辑分支
   *
   * 此方法是人工智能写的,用于将targets集合中的数据按照materialID进行分组，并按照projectCode进一步合并，最终将合并后的数据存储在_map中
   */
  public addTarget(targets: Record<string, any>[], key: string = 'materialID', flag: boolean = true): void {
    const materialIdMap: Record<string, Record<string, any>[]> = {};

    // 第一步：先按照materialID进行分组
    targets.forEach((item) => {
      const currentKey = item[key];
      if (!materialIdMap[currentKey]) {
        materialIdMap[currentKey] = [];
      }
      materialIdMap[currentKey].push(item);
    });

    // 第二步：遍历分组后的数据，根据projectCode进一步合并
    Object.entries(materialIdMap).forEach(([materialId, items]) => {
      const projectCodeMap: Record<string, Record<string, any>[]> = {};
      items.forEach((item) => {
        const projectCode = item.projectCode;
        if (!projectCodeMap[projectCode]) {
          projectCodeMap[projectCode] = [];
        }
        projectCodeMap[projectCode].push(item);
      });

      // 处理每个projectCode分组下的数据
      Object.values(projectCodeMap).forEach((projectCodeGroup) => {
        const combinedKey = `${materialId}_${getKeyRouter()}${getKeyRouter()}`;
        if (flag) {
          const firstItem = projectCodeGroup[0];
          if (projectCodeGroup.length > 1) {
            const existingTarget = this._map.get(combinedKey);
            if (existingTarget && existingTarget[0].projectCode === firstItem.projectCode) {
              this._map.set(combinedKey, [...existingTarget, ...projectCodeGroup]);
            } else {
              this._map.set(combinedKey, projectCodeGroup);
            }
          } else {
            this._map.set(combinedKey, projectCodeGroup);
          }
        } else {
          this._map.set(combinedKey, projectCodeGroup);
        }
      });
    });
  }

  /**
   * @param targets 集合
   * @param key 键
   * */
  // public addTarget(targets: Record<string, any>[], key: string): void {
  //   targets?.forEach((item: Record<string, any>) => {
  //     // 如果有【物料ID {key}】
  //     if (this?._map?.has(item[key])) {
  //       // 获取
  //       const target = this?._map?.get(item[key]);
  //       // 扩展对应数据
  //       this?._map?.set(item[key], [...target, item]);
  //     } else {
  //       // 在库中没有
  //       this?._map?.set(item[key], [item]);
  //     }
  //   });
  // }

  public getTarget(isCustomNeedMatrials: boolean = false): Record<string, any>[] {
    for (let pairs of this._map.values()) {
      // 两个物料对象合并成一个新对象
      let newTarget: Record<string, any> = {};
      let expectNum: number = 0; // 计划数量
      let expectSum: number = 0; // 预估总价

      pairs.map((item: Record<string, any>) => {
        // 累加【计划数量】&&【预估总价】
        expectNum += Number(item.expectNum);
        expectSum += Number(item?.expectNum || 0) * Number(item?.expectPrice || 0);
      });
      let expectPrice = (expectSum / expectNum).toFixed(2);
      newTarget = {
        ...pairs[0],
        expectNum: expectNum,
        expectSum: expectSum.toFixed(2),
        // expectPrice: isFalsy(expectPrice) ? 0 : expectPrice,
        expectPrice: expectPrice == 'NaN' ? 0 : expectPrice,
      };
      if (isCustomNeedMatrials) {
        newTarget['customNeedMatrials'] = pairs;
      }

      this._targets.push(newTarget);
    }
    return this._targets;
  }
}

export { CreateTarget };

/**
 * @param targets 集合
 * @param key 键 [唯一性]
 * */
// public addTarget(targets: Record<string, any>[], key: string, flag: boolean = true): void {
//   targets?.forEach((item: Record<string, any>) => {

//     // 独立的key
//     let sole_key = item[key] + '_' + getKeyRouter() + getKeyRouter()

//     // 当前物料的ID
//     let MID = item[key]

//     // 标识
//     let num = -1

//     console.log("=========================>>>>>>",sole_key, MID, this?._map?.keys())

//     for (let _key of this?._map?.keys()) {
//       num = num++
//       // 循环取map中的每一个key
//       let local_key = _key?.split?.('_')?.[0]
//       // 如果当前物料id和map中的key有匹配的话
//       if (local_key == MID) {
//         // 拿到当前map中对应key的value值集合
//         const target = this?._map?.get(_key);
//         if (flag) {
//           let fristNode = target?.[0]
//           if (fristNode?.projectCode == item?.projectCode) {
//             // 扩展对应数据
//             this?._map?.set(_key, [...target, item]);
//           } else {
//             // 如果【项目编码】不一致
//             continue; // 跳出此次循环
//           }
//         } else {
//           // 扩展对应数据
//           this?._map?.set(_key, [...target, item]);
//         }
//       } else {
//         if (flag) {
//           const keysArray = Array.from(this?._map?.keys());
//           keysArray?.slice(num)
//           let f = false
//           keysArray?.forEach((items: any) => {
//             if (items?.split?.('_')?.[0] == MID) {
//               f = true
//             }
//           })
//           if (!f) {
//             this?._map?.set(sole_key, [item]);
//           }
//         } else {
//           this?._map?.set(sole_key, [item]);
//         }
//       }
//     }

//     // 如果有【物料ID {key}】
//     // let local_key =
//     // if (this?._map?.has(item[key])) {
//     //   // 获取已存储集合
//     //   const target = this?._map?.get(item[key]);
//     //   if (flag) {
//     //     let ite = target?.[0]
//     //     if (ite?.projectCode == item?.projectCode) {
//     //       // 扩展对应数据
//     //       this?._map?.set(item[key], [...target, item]);
//     //     } else {
//     //       // 如果【项目编码】不一致，则不合并 （）
//     //       this?._map?.set(item[key], [item]);
//     //       return
//     //     }
//     //   } else {
//     //     // 扩展对应数据
//     //     this?._map?.set(item[key], [...target, item]);
//     //   }
//     // } else {
//     //   let sole_key = key + '_' + getKeyRouter() + getKeyRouter()
//     //   // 在库中没有
//     //   this?._map?.set(item[sole_key], [item]);
//     // }
//   });
// }
